#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：    send_request.py.py
   Author :       zyq
   CreateDate：   2024/7/18 18:34
   Remark :  封装http请求类
-------------------------------------------------
"""

import allure
import requests

from apitesting.common.file.json_util import JsonUtil
from apitesting.common.util.logger import Log


class HttpRequest:
    @allure.step("发起请求")
    def __init__(self, method: str, url: str, data=None, cookies=None, headers=None):
        """
        请求的基础类
        :param method: 请求方式
        :param url: 请求的url
        :param data: 请求的参数
        :param cookies: 请求中带的cookie
        :param headers: 请求头
        """
        try:
            # 判断请求方式，根据请求方式执行不同的请求方法
            if method.upper() == "GET":
                # 使用GET请求方式发送请求
                self._res = requests.session().request(method=method.lower(), url=url, params=data, headers=headers, cookies=cookies)
            elif method.upper() == "POST":
                # 判断data是否为字符串类型
                if isinstance(data, str):
                    # 如果data是字符串类型，则将其解析为JSON对象后发送请求
                    self._res = requests.session().post(
                        url=url,
                        json=JsonUtil.load_json(data),
                        headers=headers,
                        cookies=cookies
                    )
                else:
                    # 如果data不是字符串类型，则直接发送请求
                    self._res = requests.session().post(
                        url=url,
                        json=data,
                        headers=headers,
                        cookies=cookies
                    )
            else:
                # 如果请求方式不在GET和POST中，则记录错误日志
                Log.error(f"请求类未添加对应请求方式{method}")

            # 记录请求日志
            with allure.step("请求日志"):
                Log.info("-----------------------------------------------")
                Log.info("请求信息:")
                Log.info(f"request_url:{self._res.request.url}")
                Log.info(f"request_headers:{self._res.request.headers}")
                Log.info(f"request_body:{self._res.request.body}")
                Log.info(f"request_cookies:{self._res.cookies}")
                Log.info("响应信息:")
                Log.info(f"response_headers:{self._res.headers}")
                Log.info(f"response_body:{self._res.text}")
                Log.info("-----------------------------------------------")

        except Exception:
            # 捕获异常并记录错误日志
            Log.error(Exception)
            raise Exception("请求异常请检查")

    # 获取请求的cookies
    def get_cookies(self):
        return self._res.cookies

    # 获取接口返回的json对象
    def get_json(self):
        return self._res.json()

    # 获取接口返回的json对象
    def getText(self):
        return self._res.text

    # 获取接口的返回的code
    def get_code(self):
        return self._res.status_code

    # 获取接口的全部响应时间
    def get_response_time(self):
        return self._res.elapsed.total_seconds()

    def assert_response(self, rule):
        """
        根据给定的规则从JSON响应中提取一个值并进行断言。

        Args:
            rule (str): 用于从JSON响应中提取值的规则（JSONPath表达式）。

        Returns:
            Any: 提取到的值，具体类型取决于JSON响应中的数据类型。

        Raises:
            Exception: 如果JSON解析失败或未根据规则提取到值，则抛出异常。

        """
        return JsonUtil.json_to_one_value(jsonObj=self.get_json(), rule=rule)
